package br.com.sbc.managedBean;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import br.com.sbc.ejb.entity.Assunto;
import br.com.sbc.ejb.entity.Postagem;
import br.com.sbc.sessionBean.PostagemSessionBean;
import br.com.sbc.util.SBCconstantes;


@ManagedBean
@ViewScoped
public class PesquisaManagedBean extends BaseManagedBean{
	@EJB
	private PostagemSessionBean postagemSessionBean;
	private Postagem postagem;
	private String pesquisaDigitada;
	private Assunto assunto;
	private int numeroResultados;
	private List<Postagem> listaPostagemPorTitulo = new ArrayList<Postagem>();
	private List<Postagem> listaPostagemPorMensagem = new ArrayList<Postagem>();
	private List<Postagem> listaPostagemPorTituloeMsg = new ArrayList<Postagem>();
	private Map<String, Object> requestMap = FacesContext.getCurrentInstance().getExternalContext().getRequestMap();
	private double tempo = 0;
	
	public PesquisaManagedBean() {
		super();
	}
	@PostConstruct
	public void init() {
		try {
			pesquisaDigitada = (String) requestMap.get("pesquisaDigitada");
			if (pesquisaDigitada != null) {
				listarPostagensPesquisa();
			} else {
				pesquisaDigitada = new String();
			}
		} catch (Exception e) {
		}
	}
	public String detalharPostagem() {
		postagem = postagemSessionBean.consultaPostagemPorID(postagem.getIdPostagem());
		long view = postagem.getViews();
		++ view;
		Postagem post = postagemSessionBean.consultaPostagemPorID(postagem.getIdPostagem());
		post.setViews(view);
		postagemSessionBean.alterarPostagem(post);
		requestMap.put("postagemSelecionada", postagem);
		return SBCconstantes.PAGINA_DETALHA_POSTAGEM;
	}
	public String listaPostagens() {
		requestMap.put("assuntoSelecionado",assunto);
		return SBCconstantes.PAGINA_POSTAGENS_DO_ASSUNTO;
	}

	public String pesquisar() {
		requestMap.put("pesquisaDigitada", pesquisaDigitada);
		return SBCconstantes.PAGINA_RESULTADO_PESQUISA;
	}

	public void listarPostagensPesquisa(){
		long  init = System.currentTimeMillis();
		List<String> lista = new ArrayList<String>();
		int pos = -1, iInicial = 0, iFinal = 0;
		while (true) {
			pos = pesquisaDigitada.indexOf(" ", pos + 1);
			iFinal = pos;
			if (pos != -1) {
				lista.add(pesquisaDigitada.substring(iInicial, iFinal));
				iInicial = iFinal +1;
			} else {
				lista.add(pesquisaDigitada.substring(iInicial, pesquisaDigitada.length()));
				break;
			}
			if (pos < 0)
				break;
		}
		listaPostagemPorTitulo = postagemSessionBean.consultaTodasPostagensPorTitulo(lista.get(0).toUpperCase());
		listaPostagemPorMensagem = postagemSessionBean.consultaTodasPostagensPorMensagem(lista.get(0).toUpperCase());
		listaPostagemPorTituloeMsg.addAll(listaPostagemPorTitulo);
		listaPostagemPorTituloeMsg.addAll(listaPostagemPorMensagem);
		Set<Postagem> listaSemRepeticoes = new HashSet<Postagem>(listaPostagemPorTituloeMsg);
		listaPostagemPorTituloeMsg.clear();
		listaPostagemPorTituloeMsg.addAll(listaSemRepeticoes);
		for (Postagem postagem : listaSemRepeticoes) {
			for (String pesquisa : lista) {
				if(!(postagem.getMensagem().toUpperCase().contains(pesquisa.toUpperCase()) || postagem.getTitulo().toUpperCase().contains(pesquisa.toUpperCase()))){
					listaPostagemPorTituloeMsg.remove(postagem);
				}
			}
		}
		for (Postagem postagem : listaPostagemPorTituloeMsg) {
			for (String pesquisa : lista) {
				if(!postagem.getMensagem().contains("<pre class='brush: java'>")){
				String pesquisaDigitadaEspaco = " " + pesquisa + " ";
				String pesquisaDigitadaPonto = " " + pesquisa + ".";
				postagem.setMensagem(postagem.getMensagem().replaceAll("(?i)" + pesquisaDigitadaEspaco, "<b>" + pesquisaDigitadaEspaco.toUpperCase() + "</b> "));
					if (postagem.getMensagem().toUpperCase().contains(pesquisaDigitadaPonto.toUpperCase())) {
					postagem.setMensagem(postagem.getMensagem().replaceAll("(?i)" + pesquisaDigitadaPonto, "<b>" + pesquisaDigitadaPonto.toUpperCase() + "</b> "));
					}
				}
			}
			numeroResultados++;
		}
			tempo = System.currentTimeMillis();
			tempo = (tempo- init)/1000.0;
	}
	
	public Postagem getPostagem() {
		return postagem;
	}


	public void setPostagem(Postagem postagem) {
		this.postagem = postagem;
	}


	public String getPesquisaDigitada() {
		return pesquisaDigitada;
	}


	public void setPesquisaDigitada(String pesquisaDigitada) {
		this.pesquisaDigitada = pesquisaDigitada;
	}
	
	public PostagemSessionBean getPostagemSessionBean() {
		return postagemSessionBean;
	}


	public void setPostagemSessionBean(PostagemSessionBean postagemSessionBean) {
		this.postagemSessionBean = postagemSessionBean;
	}


	public List<Postagem> getListaPostagemPorTitulo() {
		return listaPostagemPorTitulo;
	}


	public void setListaPostagemPorTitulo(List<Postagem> listaPostagemPorTitulo) {
		this.listaPostagemPorTitulo = listaPostagemPorTitulo;
	}


	public List<Postagem> getListaPostagemPorMensagem() {
		return listaPostagemPorMensagem;
	}


	public void setListaPostagemPorMensagem(List<Postagem> listaPostagemPorMensagem) {
		this.listaPostagemPorMensagem = listaPostagemPorMensagem;
	}


	public List<Postagem> getListaPostagemPorTituloeMsg() {
		return listaPostagemPorTituloeMsg;
	}


	public void setListaPostagemPorTituloeMsg(
			List<Postagem> listaPostagemPorTituloeMsg) {
		this.listaPostagemPorTituloeMsg = listaPostagemPorTituloeMsg;
	}
	public Assunto getAssunto() {
		return assunto;
	}
	public void setAssunto(Assunto assunto) {
		this.assunto = assunto;
	}
	public int getNumeroResultados() {
		return numeroResultados;
	}
	public void setNumeroResultados(int numeroResultados) {
		this.numeroResultados = numeroResultados;
	}
	public double getTempo() {
		return tempo;
	}
	public void setTempo(double tempo) {
		this.tempo = tempo;
	}
	
}
